package reservas;

import java.util.*;

import usuarios.Usuario;
import asientos.Asiento;
import asientos.EstadoDeAsientoIncorrectoException;
import asientos.Vuelo;

public class AdministradorDeReservas {
	// busquedas deben poder filtar por
	// x solo asientos libres
	// x incluir tambien reservados
	// tambien debe quedar identificado el vuelo completo
	
	// no se pueden comprar asientos reservados por otra persona (lo controla la aerolinea)
	
	private List<Reserva> reservas;
	
	public AdministradorDeReservas() {
		this.reservas = new ArrayList<Reserva>();
	}
	
	private Reserva getReserva(Vuelo unAsiento) {
		for(Reserva unaReserva : this.reservas) {
			if (unaReserva.getAsiento().equals(unAsiento)) {
				return unaReserva;
			}
		}
		
		return null;
	}

	public void sobrereservar(Usuario unUsuario, Vuelo unAsiento) {
		this.validarUsuario(unUsuario);
		this.getReserva(unAsiento).sobrereservar(unUsuario);
	}

	// no todas las aerolineas admiten reservas
	// solamente est disponible para usuarios estndar
	// aterrizar admite sobre reserva (las aerolineas no saben lo que es)
	public void reservar(Usuario unUsuario, Vuelo unAsiento) {
		this.validarUsuario(unUsuario);
		
		// busco si la reserva ya existe
		if (this.getReserva(unAsiento) != null) {
			throw new EstadoDeAsientoIncorrectoException();
		}
		
		// no existe: creo una nueva
		Reserva reserva = new Reserva(unAsiento, unUsuario);				
		this.reservas.add(reserva);			
		
	}

	private void validarUsuario(Usuario unUsuario) {
		if (!unUsuario.puedeHacerReservas()) {
			throw new ClaseDeUsuarioNoPuedeReservarException(unUsuario);
		}
	}

	public Reserva buscarReserva(Asiento unAsiento) {
		for(Reserva miReserva : this.reservas) {
			if (miReserva.getAsiento().equals(unAsiento)) {
				return miReserva;
			}
		}
		return null;
	}
	
	public void borrarReserva(Asiento unAsiento) {
		this.borrarReserva(this.getReserva(unAsiento));		
	}
	
	private void borrarReserva(Reserva unaReserva) { 
		this.reservas.remove(unaReserva);
	}
	
	// quitar al usuario actual
	// volver a reservar en la aerolinea original
	// transferir al siguiente usuario (si existe)
	// TODO - Bruno - Reserva Vencida
	public void ReservaVencida(Reserva unaReserva) {
		// buscarla en la lista de reservas
		Reserva miReserva = this.buscarReserva(unaReserva);
		
		// si tiene un unico usuario la borro y chau
		if (!miReserva.sobreReservada())
		{
			this.borrarReserva(miReserva);
			return;
		}
		
		// transfiero la reserva 
		miReserva.Transferir();
		
	}
	
	private Reserva buscarReserva(Reserva unaReserva) {
		for(Reserva miReserva : this.reservas) {
			if (miReserva.equals(unaReserva)) {
				return unaReserva;
			}
		}
		return null;
	}
}
